package io.gitee.zhucan123.core.infrastructure.dataconversion;

import org.springframework.beans.BeanUtils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.function.Function;

/**
 * @author: zhuCan
 * @date: 2019-07-17 14:27
 * @description: command 类 转换 entity 的抽象 父类
 * 或者是 entity 转换为 dto
 */

public abstract class AbstractBaseAssembler<S, T> implements Function<S, T> {


  /**
   * 重写 转换的方法
   *
   * @param s
   * @return T
   */
  @Override
  public T apply(S s) {
    if (s == null) {
      return null;
    }
    //获取 子类中 <S,T> 规定的参数类型
    Type[] actualTypeArguments = ((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments();
    if (actualTypeArguments != null && actualTypeArguments.length > 0) {
      //获取第二个泛型参数 T
      Class<T> clazz = (Class<T>) actualTypeArguments[1];

      T t = null;
      try {
        t = clazz.newInstance();
      } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace();
      }
      //调用 赋值
      BeanUtils.copyProperties(s, t);

      return t;
    }

    return null;
  }

  /**
   * 初始化 需要转换返回的对象
   *
   * @return T
   */
  protected T init() {
    return null;
  }
}
